wayland: emit ::enter/leave-monitor
authorMatthias Clasen <mclasen@redhat.com>
Wed, 29 Nov 2017 03:37:42 +0000 (22:37 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 13 Apr 2020 11:54:31 +0000 (07:54 -0400)
These signals directly mirror the surface_enter/leave events
of the Wayland protocol, so this is very staightforward.

gdk/wayland/gdkdisplay-wayland.c
gdk/wayland/gdkprivate-wayland.h
gdk/wayland/gdksurface-wayland.c

index dc8c52f305f3f9d8ab28d95301ec2de5f6a32473..e30acdad1b7f69f1a3566df7d61634807ddc5871 100644 (file)
@@ -2539,6 +2539,13 @@ get_monitor_for_output (GdkWaylandDisplay *display_wayland,
   return NULL;
 }
 
+GdkMonitor *
+gdk_wayland_display_get_monitor_for_output (GdkDisplay       *display,
+                                            struct wl_output *output)
+{
+  return (GdkMonitor *)get_monitor_for_output (GDK_WAYLAND_DISPLAY (display), output);
+}
+
 static void
 gdk_wayland_display_remove_output (GdkWaylandDisplay *display_wayland,
                                    guint32            id)
index 13dbd221e0f7944f65c4240e0b99447afb078144..99fa9b5d4b41fff87f9f1547d0c2264c5621a0ec 100644 (file)
@@ -163,6 +163,8 @@ guint32 gdk_wayland_display_get_output_scale (GdkWaylandDisplay *display_wayland
                                               struct wl_output  *output);
 struct wl_output *gdk_wayland_display_get_wl_output (GdkDisplay *display,
                                                      int         monitor_num);
+GdkMonitor *gdk_wayland_display_get_monitor_for_output (GdkDisplay       *display,
+                                                        struct wl_output *output);
 
 void _gdk_wayland_surface_set_grab_seat (GdkSurface      *surface,
                                         GdkSeat        *seat);
index 06de4fa500690f415446282e1d71f6c4ce20e38e..82fae79e8e9df684f6d0c4f4b3fc7f6a2b3e82de 100644 (file)
@@ -1201,6 +1201,8 @@ surface_enter (void              *data,
 {
   GdkSurface *surface = GDK_SURFACE (data);
   GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
+  GdkDisplay *display = gdk_surface_get_display (surface);
+  GdkMonitor *monitor;
 
   GDK_DISPLAY_NOTE (gdk_surface_get_display (surface), EVENTS,
             g_message ("surface enter, surface %p output %p", surface, output));
@@ -1208,6 +1210,9 @@ surface_enter (void              *data,
   impl->display_server.outputs = g_slist_prepend (impl->display_server.outputs, output);
 
   gdk_wayland_surface_update_scale (surface);
+
+  monitor = gdk_wayland_display_get_monitor_for_output (display, output);
+  gdk_surface_enter_monitor (surface, monitor);
 }
 
 static void
@@ -1217,6 +1222,8 @@ surface_leave (void              *data,
 {
   GdkSurface *surface = GDK_SURFACE (data);
   GdkWaylandSurface *impl = GDK_WAYLAND_SURFACE (surface);
+  GdkDisplay *display = gdk_surface_get_display (surface);
+  GdkMonitor *monitor;
 
   GDK_DISPLAY_NOTE (gdk_surface_get_display (surface), EVENTS,
             g_message ("surface leave, surface %p output %p", surface, output));
@@ -1225,6 +1232,9 @@ surface_leave (void              *data,
 
   if (impl->display_server.outputs)
     gdk_wayland_surface_update_scale (surface);
+
+  monitor = gdk_wayland_display_get_monitor_for_output (display, output);
+  gdk_surface_leave_monitor (surface, monitor);
 }
 
 static const struct wl_surface_listener surface_listener = {